import { GenderEnum } from '@/enums/genderEnum';
import { ChineseZodiacSignEnum } from '@/enums/chineseZodiacSignEnum';
import { OrganizationTypeEnum } from '@/enums/organizationTypeEnum';
import { StarSignEnum } from '@/enums/starSignEnum';

/** 请求的客户端类型 */
export enum RequestClientTypeEnum {
  /** 浏览器 */
  Browser = 1,
  /** 桌面客户端 */
  Desktop = 2,
  /** 移动客户端 */
  Mobile = 3,
}
/** 第三方认证服务提供商 */
export enum OAuth2ProviderEnum {
  /** 微信 */
  WeChat = 1,
  /** 钉钉 */
  DingTalk = 2,
  /** 抖音 */
  DouYin = 3,
  /** QQ */
  QQ = 4,
  /** 微软账户 */
  Microsoft = 5,
  /** GitHub账户 */
  GitHub = 6,
}

/** 登录信息DTO */
export interface LoginDto {
  /** 登录账号，可以是用户名，Email，手机号等 */
  Account: string | null;
  /** 登录密码 */
  Password: string | null;
  /** 组织机构编号 */
  OrganizationId?: string | null | undefined;
  /** 记住登录 */
  Remember?: boolean | undefined;
  /** 客户端类型 */
  ClientType?: RequestClientTypeEnum | undefined;
  /** 客户端ID，注：相同的用户身份、客户端ID只能同时登录一个，若不限制，该属性置空 */
  ClientId?: string | null | undefined;
  /** 是否Token登录 */
  IsToken?: boolean | undefined;
  /** IP地址 */
  Ip?: string | null | undefined;
  /** 客户端代理头 */
  UserAgent?: string | null | undefined;
  /** 回调地址 */
  ReturnUrl?: string | null | undefined;

  /** 验证码 */
  VerifyCode?: string | null | undefined;
  /** 验证码编号 */
  VerifyCodeId?: string | null | undefined;
}
/** 身份认证令牌请求DTO */
export interface TokenDto {
  /** 身份认证令牌请求类型 */
  GrantType: 'password' | 'refresh_token';
  /** 账户名，可以是用户名，Email，手机号等 */
  Account?: string | null;
  /** 密码 */
  Password?: string | null;
  /** 组织机构编号 */
  OrganizationId?: string | null | undefined;
  /** 客户端类型 */
  ClientType?: RequestClientTypeEnum | undefined;
  /** 客户端ID，注：相同的用户身份、客户端ID只能同时登录一个，若不限制，该属性置空 */
  ClientId?: string | null | undefined;
  /** 刷新令牌 */
  RefreshToken?: string | null | undefined;

  /** 验证码 */
  VerifyCode?: string | null | undefined;
  /** 验证码编号 */
  VerifyCodeId?: string | null | undefined;
}
/** 手机号令牌请求DTO */
export interface PhoneTokenDto {
  /** 手机号码 */
  PhoneNumber: string;
  /** 短信验证码 */
  SmsCode: string;
  /** 短信验证码编号 */
  SmsCodeId: string;
  /** 组织机构编号 */
  OrganizationId?: string | null | undefined;
  /** 客户端类型 */
  ClientType?: RequestClientTypeEnum | undefined;
  /** 客户端ID，注：相同的用户身份、客户端ID只能同时登录一个，若不限制，该属性置空 */
  ClientId?: string | null | undefined;

  /** 验证码 */
  VerifyCode?: string | null | undefined;
  /** 验证码编号 */
  VerifyCodeId?: string | null | undefined;
}
/** 授权码身份认证令牌请求DTO */
export interface AuthorizationTokenDto {
  /** 账号 */
  Account: string;
  /** 授权码 */
  AuthCode: string;
  /** 组织机构编号 */
  OrganizationId?: string | null | undefined;
  /** 客户端类型 */
  ClientType?: RequestClientTypeEnum | undefined;
  /** 客户端ID，注：相同的用户身份、客户端ID只能同时登录一个，若不限制，该属性置空 */
  ClientId?: string | null | undefined;

  /** 验证码 */
  VerifyCode?: string | null | undefined;
  /** 验证码编号 */
  VerifyCodeId?: string | null | undefined;
}
/** 第三方身份获取TokenDTO */
export interface OAuth2TokenDto {
  /** 登录提供程序 */
  Provider: OAuth2ProviderEnum;
  /** 第三方认证ID */
  AppId: string;
  /** 第三方认证SECRET */
  AppSecret: string;
  /** 第三方认证CODE */
  Code: string;

  /** 回调地址 */
  ReturnUrl?: string | null | undefined;

  /** 验证码 */
  VerifyCode?: string | null | undefined;
  /** 验证码编号 */
  VerifyCodeId?: string | null | undefined;
}
/** 第三方用户登录信息 */
export interface UserLoginInfoEx {
  /** 登录提供程序 */
  LoginProvider?: string | null | undefined;
  /** 登录唯一标识 */
  ProviderKey: string;
  /** 显示名称 */
  DisplayName?: string | null | undefined;

  /** 头像URL */
  AvatarUrl?: string | null | undefined;
  /** 注册IP */
  RegisterIp?: string | null | undefined;
  /** 登录账号 */
  Account?: string | null | undefined;
  /** 登录密码 */
  Password?: string | null | undefined;
}
/** 输出DTO：OAuth2登录信息 */
export interface UserLoginOutputDto {
  /** 编号 */
  Id?: string | bigint;

  /** 所属用户编号 */
  UserId?: string | bigint;

  /** 登录提供程序 */
  LoginProvider?: string;
  /** 显示名称 */
  DisplayName?: string;
  /** 头像 */
  Avatar?: string;
  /** 创建时间 */
  CreatedTime?: Date;
}
/** 二维码令牌DTO */
export interface QRCoderTokenDto {
  /** 编号 */
  Id: string;

  /** 客户端类型 */
  ClientType?: RequestClientTypeEnum;
  /** 客户端ID */
  ClientId?: string | null;
  /** 提供者秘钥 */
  ProviderKey?: string | null;
  /** 组织机构编号 */
  OrganizationId?: string | null;

  /** Logo图片的Base64格式 */
  LogoImage?: string | null;
}

/** JwtToken模型 */
export interface JsonWebToken {
  /** 用于业务身份认证的AccessToken */
  AccessToken: string;
  /** AccessToken有效期，UTC标准 */
  AccessTokenExpiresUtc: string | bigint;
  /** 用于刷新AccessToken的RefreshToken */
  RefreshToken: string;
  /** RefreshToken有效期，UTC标准 */
  RefreshTokenExpiresUtc: string | bigint;
}

/** 用户注册信息DTO */
export interface RegisterDto {
  /** 用户名 */
  UserName: string;
  /** 用户昵称 */
  NickName?: string;
  /** 密码 */
  Password?: string;
  /** 确认密码 */
  ConfirmPassword?: string;
  /** 电子邮箱 */
  Email?: string;
  /** 邮箱确认地址 */
  EmailConfirmUrl?: string;
  /** 手机号码 */
  PhoneNumber?: string;
  /** 短信验证码 */
  SmsCode?: string;
  /** 短信验证码编号 */
  SmsCodeId?: string;
  /** 组织机构编号 */
  OrganizationId?: string | null;

  /** 验证码 */
  VerifyCode?: string;
  /** 验证码编号 */
  VerifyCodeId?: string;
}

/** 确认手机DTO */
export interface ConfirmPhoneDto {
  /** 手机号码 */
  PhoneNumber: string;
  /** 短信验证码 */
  SmsCode: string;
  /** 短信验证码编号 */
  SmsCodeId: string;
}
/** 确认邮箱DTO */
export interface ConfirmEmailDto {
  /** 电子邮箱 */
  Email: string | null | undefined;
  /** 邮件码 */
  Code: string | null | undefined;
}

/** 在线角色 */
export interface OnlineRole {
  /** 角色编号 */
  Id: string;
  /** 角色名称 */
  Name: string;
  /** 角色描述 */
  Remark: string | null | undefined;
  /** 是否管理员角色 */
  IsAdmin: boolean;
}

/** 组织机构身份 */
export interface OrganizationIdentity {
  /** 组织机构编号 */
  Id: string;

  /** 组织机构类型 */
  Type: OrganizationTypeEnum;
  /** 组织机构名称 */
  Name: string;
}
/** 组织机构节点 */
export interface OrganizationNode extends OrganizationIdentity {
  /** 组织机构描述 */
  Description: string;

  /** 顺序编号 */
  OrderNo: number;
  /** 节点树形路径，形如："$1$,$3$,$4$,$7$"，编辑时更新 */
  TreePathString: string;
  /** 父组织机构编号 */
  ParentId: string | null;

  /** 启用登陆 */
  EnableLogin: boolean;
  /** 是否默认组织机构，用户注册后拥有此组织机构 */
  IsDefault: boolean;
  /** 是否系统组织机构 */
  IsSystem: boolean;

  /** 是否锁定当前信息 */
  IsLocked: boolean;

  /** 创建时间 */
  CreatedTime: Date;
  /** 更新时间 */
  UpdatedTime?: Date;

  /** 层级 */
  Level: number;
}
/** 组织机构树形节点 */
export interface OrganizationTreeNode extends OrganizationNode {
  /** 是否有子项 */
  HasChildren: boolean;
  /** 子项集合 */
  Items: OrganizationTreeNode[];
}
/** 简单组织机构DTO */
export interface OrganizationDtoSimple {
  /** 组织机构编号 */
  Id: string;
  /** 组织机构类型 */
  Type: OrganizationTypeEnum;
  /** 组织机构名称 */
  Name: string;
  /** 组织机构描述 */
  Description: string;

  /** 顺序编号 */
  OrderNo: number;
  /** 节点树形路径，形如："$1$,$3$,$4$,$7$"，编辑时更新 */
  TreePathString: string;
  /** 父组织机构编号 */
  ParentId: string | null;

  /** 启用登陆 */
  EnableLogin: boolean;
  /** 是否默认组织机构，用户注册后拥有此组织机构 */
  IsDefault: boolean;
  /** 是否系统组织机构 */
  IsSystem: boolean;

  /** 是否锁定当前信息 */
  IsLocked: boolean;

  /** 创建时间 */
  CreatedTime: Date;
}

/** 用户资料DTO */
export interface ProfileDto {
  /** 主键 */
  Key?: string;

  /** 用户编号 */
  UserId: string;
  /** 用户名 */
  UserName: string;
  /** 用户昵称 */
  NickName: string;
  /** 电子邮箱 */
  Email: string;
  /** 手机号码 */
  PhoneNumber: string;

  /** 电子头像 */
  Avatar: string;
  /** 电子签名 */
  Signature: string;

  /** 性别 */
  Gender: GenderEnum;
  /** 生日 */
  Birthday?: Date;
  /** 血型 */
  BloodType?: string;
  /** 标签 */
  Tag?: string[];
  /** 头衔 */
  Title?: string[];
  /** 地址 */
  Address?: string;
  /** 简介 */
  Profile?: string;
  /** 个性签名 */
  Sign?: string;
  /** 备注 */
  Remark: string;

  /** 主页 */
  HomePath: string;

  /** 农历生日 */
  ChineseBirthday?: Date;
  /** 年龄 */
  Age: number;
  /** 生肖 */
  ZodiacSign?: ChineseZodiacSignEnum;
  /** 星座 */
  StarSign?: StarSignEnum;

  /** 是否管理员 */
  IsAdmin: boolean;

  /** 下次请求是否刷新AccessToken */
  IsRefreshNext: boolean;

  /** 用户角色 */
  Roles: OnlineRole[];

  /** 当前组织机构 */
  CurrentOrganization: OrganizationIdentity;
  /** 当前部门机构 */
  CurrentDepartment: OrganizationIdentity;

  /** 扩展数据字典 */
  ExtendData: { [key: string]: string };
}
/** 用户资料编辑DTO */
export interface ProfileEditDto {
  /** 主键 */
  Id?: string | bigint;

  /** 用户名 */
  UserName?: string | null;
  /** 用户昵称 */
  NickName?: string | null;
  /** 电子邮箱 */
  Email?: string | null;
  /** 手机号码 */
  PhoneNumber?: string | null;

  /** 电子头像 */
  Avatar?: string | null;
  /** 电子签名 */
  Signature?: string | null;

  /** 性别 */
  Gender: GenderEnum;
  /** 生日 */
  Birthday: Date | null | undefined;
  /** 血型 */
  BloodType: string | null | undefined;
  /** 标签 */
  Tag: string[] | null | undefined;
  /** 头衔 */
  Title: string[] | null | undefined;
  /** 地址 */
  Address: string | null | undefined;
  /** 简介 */
  Profile: string | null | undefined;
  /** 个性签名 */
  Sign: string | null | undefined;
  /** 备注 */
  Remark?: string | null;

  /** 主页 */
  HomePath?: string | null;
}
/** 修改密码DTO */
export interface ChangePasswordDto {
  /** 旧密码 */
  OldPassword: string | null;
  /** 新密码 */
  NewPassword: string | null;
  /** 新密码确认 */
  ConfirmNewPassword: string | null;
}

/** 发送电子邮件DTO */
export interface SendEmailDto {
  /** 电子邮箱 */
  Email: string;
  /** 邮箱确认地址 */
  EmailConfirmUrl?: string;

  /** 验证码 */
  VerifyCode?: string | null;
  /** 验证码编号 */
  VerifyCodeId?: string | null;
}

/** 根据电子邮箱重置密码DTO */
export interface ResetPwdEmailDto {
  /** 电子邮箱 */
  Email: string;
  /** 重置密码校验标识，由邮箱发送 */
  Token: string;
  /** 新密码 */
  NewPassword: string | null;
  /** 确认密码 */
  ConfirmPassword: string | null;
}
/** 根据手机重置密码DTO */
export interface ResetPwdPhoneDto {
  /** 手机号码 */
  PhoneNumber: string;
  /** 短信验证码 */
  SmsCode: string;
  /** 短信验证码编号 */
  SmsCodeId: string;
  /** 新密码 */
  NewPassword: string | null;
  /** 确认密码 */
  ConfirmPassword: string | null;
}

/** 用户邮箱变更DTO */
export interface EmailEditDto {
  /** 主键，唯一标识 */
  Id: string | bigint;
  /** 电子邮箱 */
  Email: string | null;
  /** 邮箱确认地址 */
  EmailConfirmUrl?: string;

  /** 验证码 */
  VerifyCode?: string | null;
  /** 验证码编号 */
  VerifyCodeId?: string | null;
}
/** 用户手机变更DTO */
export interface PhoneEditDto {
  /** 主键，唯一标识 */
  Id: string | bigint;
  /** 手机号码 */
  PhoneNumber: string | null;
  /** 短信验证码 */
  SmsCode: string | null;
  /** 短信验证码编号 */
  SmsCodeId: string | null;

  /** 验证码 */
  VerifyCode?: string | null;
  /** 验证码编号 */
  VerifyCodeId?: string | null;
}

/**  权限配置信息 */
export class AuthConfig {
  constructor(
    /** 当前模块的位置，即上级模块的路径，如Root,Root.Admin,Root.Admin.Identity */
    public position: string,
    /** 要权限控制的功能名称，可以是节点名称或全路径 */
    public funcs: string[],
  ) {}
}

/**  用户信息 */
export interface UserInfo {
  /** 用户编号 */
  UserId: string;
  /** 用户名 */
  UserName: string;
  /** 用户昵称 */
  NickName: string;
  /** 电子邮箱 */
  Email: string;
  /** 手机号码 */
  PhoneNumber: string;

  /** 电子头像 */
  Avatar: string;
  /** 电子签名 */
  Signature: string;

  /** 性别 */
  Gender: GenderEnum;
  /** 生日 */
  Birthday?: Date;
  /** 血型 */
  BloodType?: string;
  /** 标签 */
  Tag?: string[];
  /** 头衔 */
  Title?: string[];
  /** 地址 */
  Address?: string;
  /** 简介 */
  Profile?: string;
  /** 个性签名 */
  Sign?: string;
  /** 备注 */
  Remark: string;

  /** 农历生日 */
  ChineseBirthday?: Date;
  /** 年龄 */
  Age?: number;
  /** 生肖 */
  ZodiacSign?: ChineseZodiacSignEnum;
  /** 星座 */
  StarSign?: StarSignEnum;

  /** 是否管理员 */
  IsAdmin: boolean;

  /** 下次请求是否刷新AccessToken */
  IsRefreshNext: boolean;

  /** 用户角色 */
  Roles: OnlineRole[];

  /** 当前组织机构 */
  CurrentOrganization: OrganizationIdentity;
  /** 当前部门机构 */
  CurrentDepartment: OrganizationIdentity;

  /** 扩展数据字典 */
  ExtendData: { [key: string]: string };

  /** 用户自定义主页 */
  HomePath?: string;
}
